<?php

define("MICROTIME", microtime(TRUE));
header("Use-Compress:1");
header("Cache-Control:no-cache, must-revalidate");
header("Expires:Sat, 26 Jul 1997 05:00:00 GMT");
define("ROOT_DIR", dirname(__FILE__) . "/..");
define("CONFIG_DIR", ROOT_DIR . "/Config/");
define("CORE_DIR", ROOT_DIR . "/Core/");
define("MOD_DIR", ROOT_DIR . "/Model/");
define("CON_DIR", ROOT_DIR . "/Controller/");
define("TPL_DIR", ROOT_DIR . "/Tpl/");
define("THIRD_DIR", ROOT_DIR . "/Third/");

//载入核心文件
include CORE_DIR . 'Common.php';

$config = Common::getConfig();

//DEBUG模式 - 能直接设定用户ID和DATA数据 且PHP会报错
define('DEBUG', $config['debug']);

//入口
Application::main();

/**
 * 应用入口类
 *
 * @author Samuel
 */
class Application {
    /**
     * API入口, 包括全局信息
     *
     * @param string    $con        controller参数，GET方式传递
     * @param string    $act        act参数，GET方式传递
     * @param int       $uId        用户id，GET方式传递（登录、注册接口不需要）
     * @param string    $sessionId  session信息，GET方式传递（登录、注册接口不需要）
     * @param array     $data       接口中所有其他参数，POST方式传递（开发环境中可GET方式传递）
     * @return array
     * <pre>
     *  array(
     *      result:int          API执行结果（非0代表错误）
     *      msg:string          错误信息
     *      method:string       接口名称
     *      data:array(         接口返回信息
     *      )
     *  )
     * </pre>
     *
     * @author Samuel
     * @since 2012.6.1
     */
    public static function main() {
        try {
            self::ini();
            //todo:auth
            $r = self::run( $_POST['uId'] , $_POST['classId'] , $_POST['lessonId'] ,$_POST['testId'] );
            
            self::jsonOut($r['result'], $r['msg'], $r['method'], $r['data']);
        } catch (AppException $ge) {
            Helper_Log::add('api_exception', $ge);
            self::jsonOut($ge->getCode(), $ge->getMessage(), $_GET['con'] . '.' . $_GET['act'], array(), $ge->getTraceAsString());
        } catch (Exception $e) {
            Helper_Log::add('api_exception', $ge);
            self::jsonOut($e->getCode(), $e->getMessage(), $_GET['con'] . '.' . $_GET['act'], array(), $e->getTraceAsString());
        }
    }

     /**
     * 初始化
     */
    public static function ini() {
        //报错
        error_reporting(( isset($_GET['err']) && DEBUG ) ? ( E_ALL ^ E_NOTICE ) : 0 );

        //自动转义
        $magic_quotes_gpc = get_magic_quotes_gpc();

        //去除转义符 防止解析JSON出错
        if ($magic_quotes_gpc) {
            $_POST['data'] = stripslashes($_POST['data']);
        }

        //初始化数据
        $_POST = json_decode($_POST['data'], true);

        if (!is_array($_POST)) {
            $_POST = array();

            //DEBUG下可使用GET中的DATA
            if (DEBUG && $_GET['data']) {
                //去除转义符 防止解析JSON出错
                if ($magic_quotes_gpc) {
                    $_GET['data'] = stripslashes($_GET['data']);
                }
                $_POST = json_decode($_GET['data'], true);
            }
        }
    }
    
    /**
     * 验证@TODO:
     *
     * @return int
     */
    public static function auth()
    {
        //需要进行token验证的接口
        if( ucfirst( strtolower( $_GET['con'] ) ) == 'User' && in_array( strtolower( $_GET['act'] ) , array( 'login' , 'register' , 'retrievepasswd' ) ) )
        {

            //uId错误
            if( !is_numeric( $_GET['uId'] ) || $_GET['uId'] <= 0 )
            {
                throw new AppException( 2 );
            }

            //DEBUG模式验证
            if( DEBUG )
            {
                return (int)$_GET['uId'];
            }

            //缺少session信息
//            if( !isset( $_GET['sessionId'] ) )
//            {
//                throw new AppException( 3 , 'sessionId' );
//            }

            //session校验
//            $tokenHelper = Helper_Token::getInstance( $_GET['uId'] , 30 );
//            $tokenHelper->analyToken( $_GET['sessionId'] );
//            return (int)$_GET['uId'];
        }
        
        unset( $_GET['uId'] );
        return 0;
    }
    
    /**
     * 执行
     *
     * @return string
     */
    public static function run( $userId , $classId , $lessonId, $testId ) {

        $con = empty($_GET['con']) ? 'FlashController' : ucfirst(strtolower($_GET['con'])) . 'Controller';
        $act = empty($_GET['act']) ? 'init' : $_GET['act'];

        $conFile = CON_DIR . "{$con}.php";
        
        if (file_exists($conFile)) {
            include $conFile;
            $object = new $con;
            if (method_exists($object, $act)) {
                $object->setUserId( $userId );
                $object->setLessonInfo( $classId , $lessonId, $testId);
                $data = & $object->$act();
                
                //返回信息
                return array(
                    'result' => 0,
                    'msg' => '',
                    'method' => $_GET['con'] . '.' . $_GET['act'],
                    'data' => $data
                );
            }
        }

        throw new AppException(404, "{$con}/{$act}");
    }

    /**
     * 按JSON格式 输出
     *
     * @param string $result
     * @param string $msg
     * @param string $method
     * @param array $info
     * @param array $trace
     */
    private static function jsonOut($result = '', $msg = '', $method = '', $info = array(), $trace = array()) {

        if ($result != 0) {
            $msg = json_decode($msg, true);
        }
        $outputJson = array(
            'result' => $result,
            'msg' => $msg,
            'trace' => array(),
            'method' => $method,
            'data' => $info,
        );

        //测试环境输出异常跟踪信息
        if (DEBUG && !empty($trace)) {
            $outputJson['trace'] = $trace;
        }

        echo '['.json_encode($outputJson, JSON_FORCE_OBJECT).']';
    }

}